package org.spring.spring.proxy;

import net.sf.cglib.proxy.Enhancer;

import java.lang.reflect.Field;

/**
 * @projectName: sky-springboot
 * @package: org.spring.spring.proxy
 * @className: CglibProxyFactory
 * @author: zhl
 * @description: 代理对象创建工厂
 * @date: 2024/3/29 11:23
 * @version: 1.0
 */
public class CglibProxyFactory {

    public static Object getProxyInstance(Class clazz,Object target){
        Enhancer enhancer = new Enhancer();
        // 为加强器指定要代理的业务类（即为下面生成的代理类指定父类）
        enhancer.setSuperclass(clazz);
        // 设置回调：对于代理类上所有方法的调用，都会调用CallBack，而Callback则需要实现intercept()方法
        enhancer.setCallback(new CircularDependencyProxy(target));
        // 使用空构造方法创建的父类是没有属性值的
        Object object = enhancer.create();
        // 将已经初始化的属性值赋值给子类
        Field[] fields = clazz.getDeclaredFields();
        if (fields.length > 0){
            for (Field field : fields) {
                field.setAccessible(true);
                try {
                    Object filedObject = field.get(target);

                    field.set(object,filedObject);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return object;
    }
}
